Redis์ Python์ ํตํฉํ์ฌ ํจ์จ์ ์ธ ์บ์ฑ๊ณผ ๊ฒฌ๊ณ ํ ๋ฉ์์ง ํ์ ํ์ ํ์ฉํ์ธ์. ์ค์ฉ์ ์ธ ํตํฉ ๊ธฐ์ ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐฐ์๋๋ค.
Python Redis ํตํฉ: ์บ์ฑ ๋ฐ ๋ฉ์์ง ํ
Redis๋ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ ์ฅ์๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์บ์ ๋ฐ ๋ฉ์์ง ๋ธ๋ก์ปค๋ก ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค. Redis์ ์๋์ ๋ค์์ฑ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ํฅ์์ํค๋ ค๋ Python ๊ฐ๋ฐ์๋ค์๊ฒ ์ธ๊ธฐ ์๋ ์ ํ์ ๋๋ค. ์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ์ค์ฉ์ ์ธ ์์ ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ๊ณตํ๋ฉฐ, ์บ์ฑ๊ณผ ๋ฉ์์ง ํ ๋ชจ๋๋ฅผ ์ํด Python๊ณผ Redis๋ฅผ ํตํฉํ๋ ๋ฐฉ๋ฒ์ ํ๊ตฌํฉ๋๋ค.
Redis๋ฅผ Python๊ณผ ํจ๊ป ์ฌ์ฉํ๋ ์ด์
Redis๋ Python ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํตํฉ๋ ๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ์๋: Redis๋ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ์ฌ ๋งค์ฐ ๋น ๋ฅธ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ด๋ ์บ์ฑ ๋ฐ ์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
- ๋ฐ์ดํฐ ๊ตฌ์กฐ: Redis๋ ๋จ์ํ ํค-๊ฐ ์์ ๋์ด ๋ฆฌ์คํธ, ์ธํธ, ์ ๋ ฌ๋ ์ธํธ, ํด์์ ๊ฐ์ ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ง์ํ์ฌ ๋ค์ํ ์ฌ์ฉ ์ฌ๋ก์ ์ ํฉํฉ๋๋ค.
- Pub/Sub: Redis๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ ๋๋ ์ฌ์ง์ด ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ์ค์๊ฐ ํต์ ์ ์ํ ๋ฐํ/๊ตฌ๋ (publish/subscribe) ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
- ์ง์์ฑ: Redis๋ ์ฃผ๋ก ์ธ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ์์ด์ง๋ง, ์๋ฒ ์ฅ์ ๋ฐ์ ์ ๋ฐ์ดํฐ ๋ด๊ตฌ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ ์ง์์ฑ ์ต์ ์ ์ ๊ณตํฉ๋๋ค.
- ํ์ฅ์ฑ: Redis๋ ์ค๋ฉ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์๋ง์ ๋ฐ์ดํฐ์ ํธ๋ํฝ์ ์ฒ๋ฆฌํ๋๋ก ์ํ์ ์ผ๋ก ํ์ฅ๋ ์ ์์ต๋๋ค.
Redis ๋ฐ Python ํ๊ฒฝ ์ค์
Redis ์ค์น
์ค์น ๊ณผ์ ์ ์ด์ ์ฒด์ ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๋ค์์ ์ธ๊ธฐ ์๋ ํ๋ซํผ์ ๋ํ ์ง์นจ์ ๋๋ค:
- Linux (Debian/Ubuntu):
sudo apt update && sudo apt install redis-server - macOS (Homebrew ์ฌ์ฉ):
brew install redis - Windows (WSL ๋๋ Docker ์ฌ์ฉ): Windows ๊ด๋ จ ์ง์นจ์ ๊ณต์ Redis ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค. Docker๋ ์ผ๋ฐ์ ์ด๊ณ ๊ถ์ฅ๋๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
์ค์น ํ Redis ์๋ฒ๋ฅผ ์์ํ์ญ์์ค. ๋๋ถ๋ถ์ ์์คํ
์์ redis-server ๋ช
๋ น์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Redis Python ํด๋ผ์ด์ธํธ ์ค์น
Redis๋ฅผ ์ํ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ Python ํด๋ผ์ด์ธํธ๋ redis-py์
๋๋ค. pip๋ฅผ ์ฌ์ฉํ์ฌ ์ค์นํฉ๋๋ค:
pip install redis
Redis๋ฅผ ์ด์ฉํ ์บ์ฑ
์บ์ฑ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ์ ์ ๋๋ค. ์์ฃผ ์ก์ธ์คํ๋ ๋ฐ์ดํฐ๋ฅผ Redis์ ์ ์ฅํจ์ผ๋ก์จ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ถํ๋ฅผ ์ค์ด๊ณ ์๋ต ์๊ฐ์ ํฌ๊ฒ ๋จ์ถํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ ์บ์ฑ ์์
๋ค์์ Redis๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํ๋ ๊ฐ๋จํ ์์ ์ ๋๋ค:
import redis
import time
# Connect to Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# Simulate a database query
def get_data_from_database(key):
print(f"Fetching data from database for key: {key}")
time.sleep(1) # Simulate a slow database query
return f"Data for {key} from the database"
# Function to get data from cache or database
def get_data(key):
cached_data = r.get(key)
if cached_data:
print(f"Fetching data from cache for key: {key}")
return cached_data.decode('utf-8')
else:
data = get_data_from_database(key)
r.set(key, data, ex=60) # Cache for 60 seconds
return data
# Example usage
print(get_data('user:123'))
print(get_data('user:123')) # Fetches from cache
์ด ์์ ์์:
- ์ฐ๋ฆฌ๋
localhostํฌํธ6379์์ ์คํ ์ค์ธ Redis ์ธ์คํด์ค์ ์ฐ๊ฒฐํฉ๋๋ค. get_dataํจ์๋ ๋จผ์ r.get(key)๋ฅผ ์ฌ์ฉํ์ฌ Redis ์บ์์ ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ์๋์ง ํ์ธํฉ๋๋ค.- ๋ฐ์ดํฐ๊ฐ ์บ์์ ์์ผ๋ฉด ์ง์ ๋ฐํ๋ฉ๋๋ค.
- ๋ฐ์ดํฐ๊ฐ ์บ์์ ์์ผ๋ฉด
get_data_from_database๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ ธ์ Redis์ ๋ง๋ฃ ์๊ฐ(ex=60์ด)๊ณผ ํจ๊ป ์ ์ฅ๋ ํ ๋ฐํ๋ฉ๋๋ค.
๊ณ ๊ธ ์บ์ฑ ๊ธฐ์
- ์บ์ ๋ฌดํจํ: ๊ธฐ๋ณธ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์บ์๋ฅผ ๋ฌดํจํํ์ฌ ์บ์ ๋ฐ์ดํฐ๊ฐ ์ต์ ์ํ์ธ์ง ํ์ธํ์ญ์์ค. ์ด๋
r.delete(key)๋ฅผ ์ฌ์ฉํ์ฌ ์บ์๋ ํค๋ฅผ ์ญ์ ํจ์ผ๋ก์จ ์ํํ ์ ์์ต๋๋ค. - ์บ์-์ด์ฌ์ด๋ ํจํด: ์์ ์์ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์บ์์์ ์ฝ๊ณ ํ์ํ ๋ ์ ๋ฐ์ดํธํ๋ ์ญํ ์ ํ๋ ์บ์-์ด์ฌ์ด๋ ํจํด์ ๋ณด์ฌ์ค๋๋ค.
- ์ฐ๊ธฐ-์ค๋ฃจ/์ฐ๊ธฐ-๋ฐฑ ์บ์ฑ: ์ด๋ค์ ๋ฐ์ดํฐ๊ฐ ์บ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋์์ ๊ธฐ๋ก๋๊ฑฐ๋(์ฐ๊ธฐ-์ค๋ฃจ) ์บ์์ ๋จผ์ ๊ธฐ๋ก๋ ๋ค์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ธฐ๋ก๋๋(์ฐ๊ธฐ-๋ฐฑ) ๋ ๋ณต์กํ ์บ์ฑ ์ ๋ต์ ๋๋ค.
- TTL(Time-to-Live) ์ฌ์ฉ: ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์บ์๋ ๋ฐ์ดํฐ์ ์ ์ ํ TTL์ ์ค์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ ์ฌํญ์ ๋ง๋ ์ต์ ์ TTL์ ์ฐพ๊ธฐ ์ํด ์คํํ์ญ์์ค.
์ค์ฉ์ ์ธ ์บ์ฑ ์๋๋ฆฌ์ค
- API ์๋ต ์บ์ฑ: API ์๋ํฌ์ธํธ์ ์๋ต์ ์บ์ํ์ฌ ๋ฐฑ์๋ ์๋ฒ์ ๋ถํ๋ฅผ ์ค์ ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ์บ์ฑ: ์์ฃผ ์คํ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ์ฌ ์๋ต ์๊ฐ์ ํฅ์์ํต๋๋ค.
- HTML ์กฐ๊ฐ ์บ์ฑ: HTML ํ์ด์ง์ ์กฐ๊ฐ์ ์บ์ํ์ฌ ํ์ํ ์๋ฒ ์ธก ๋ ๋๋ง ์์ ์ค์ ๋๋ค.
- ์ฌ์ฉ์ ์ธ์ ์บ์ฑ: Redis์ ์ฌ์ฉ์ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ฌ ๋น ๋ฅธ ์ก์ธ์ค์ ํ์ฅ์ฑ์ ์ ๊ณตํฉ๋๋ค.
Redis๋ฅผ ์ด์ฉํ ๋ฉ์์ง ํ
Redis๋ ๋ฉ์์ง ๋ธ๋ก์ปค๋ก ์ฌ์ฉ๋์ด ๋น๋๊ธฐ ํ์คํฌ ์ฒ๋ฆฌ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๊ตฌ์ฑ ์์ ๊ฐ์ ๊ฒฐํฉ์ ํด์ ํ ์ ์์ต๋๋ค. ์ด๋ ์ด๋ฏธ์ง ์ฒ๋ฆฌ, ์ด๋ฉ์ผ ์ ์ก ๋๋ ๋ณด๊ณ ์ ์์ฑ๊ณผ ๊ฐ์ ์ค๋ ์คํ๋๋ ํ์คํฌ๋ฅผ ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ์ฒ๋ฆฌํ๋ ๋ฐ ํนํ ์ ์ฉํฉ๋๋ค.
Redis Pub/Sub
Redis์ ๋ด์ฅ ๋ฐํ/๊ตฌ๋ (pub/sub) ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ตฌ๋ ์์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค. ์ด๋ ๊ธฐ๋ณธ์ ์ธ ๋ฉ์์ง ํ๋ฅผ ๊ตฌํํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๋๋ค.
import redis
import time
import threading
# Connect to Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# Subscriber
def subscriber():
pubsub = r.pubsub()
pubsub.subscribe('my_channel')
for message in pubsub.listen():
if message['type'] == 'message':
print(f"Received message: {message['data'].decode('utf-8')}")
# Publisher
def publisher():
time.sleep(1) # Wait for subscriber to connect
for i in range(5):
message = f"Message {i}"
r.publish('my_channel', message)
print(f"Published message: {message}")
time.sleep(1)
# Start subscriber in a separate thread
subscriber_thread = threading.Thread(target=subscriber)
subscriber_thread.start()
# Start publisher in the main thread
publisher()
subscriber_thread.join()
์ด ์์ ์์:
subscriberํจ์๋pubsub.subscribe('my_channel')์ ์ฌ์ฉํ์ฌmy_channel์ฑ๋์ ๊ตฌ๋ ํฉ๋๋ค.- ๊ทธ๋ฐ ๋ค์
pubsub.listen()์ ์ฌ์ฉํ์ฌ ๋ฉ์์ง๋ฅผ ์์ ํ๊ณ ์์ ๋ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํฉ๋๋ค. publisherํจ์๋r.publish('my_channel', message)๋ฅผ ์ฌ์ฉํ์ฌmy_channel์ฑ๋์ ๋ฉ์์ง๋ฅผ ๋ฐํํฉ๋๋ค.- ๊ตฌ๋ ์๋ ๋ฐํ์๋ฅผ ์ฐจ๋จํ์ง ์๊ธฐ ์ํด ๋ณ๋์ ์ค๋ ๋์์ ์คํ๋ฉ๋๋ค.
Celery ์ฌ์ฉ
Celery๋ Redis๋ฅผ ๋ฉ์์ง ๋ธ๋ก์ปค๋ก ์ฌ์ฉํ ์ ์๋ ์ธ๊ธฐ ์๋ ๋ถ์ฐ ํ์คํฌ ํ์ ๋๋ค. Redis์ ๋ด์ฅ pub/sub์ ๋นํด ๋ฉ์์ง ํ๋ฅผ ์ํ ๋ ๊ฒฌ๊ณ ํ๊ณ ๊ธฐ๋ฅ์ด ํ๋ถํ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค.
Celery ์ค์น
pip install celery redis
Celery ๊ตฌ์ฑ
๋ค์ ๋ด์ฉ์ ํฌํจํ๋ celeryconfig.py ํ์ผ์ ์์ฑํฉ๋๋ค:
broker_url = 'redis://localhost:6379/0'
result_backend = 'redis://localhost:6379/0'
ํ์คํฌ ์ ์
๋ค์ ๋ด์ฉ์ ํฌํจํ๋ tasks.py ํ์ผ์ ์์ฑํฉ๋๋ค:
from celery import Celery
import time
app = Celery('tasks', broker='redis://localhost:6379/0', backend='redis://localhost:6379/0')
@app.task
def add(x, y):
time.sleep(5) # Simulate a long-running task
return x + y
Celery ์์ปค ์คํ
ํฐ๋ฏธ๋์ ์ด๊ณ ๋ค์ ๋ช ๋ น์ ์คํํฉ๋๋ค:
celery -A tasks worker --loglevel=info
ํ์คํฌ ํธ์ถ
from tasks import add
result = add.delay(4, 4)
print(f"Task ID: {result.id}")
# Later, you can check the result
# print(result.get()) # This will block until the task is complete
์ด ์์ ์์:
- ๋ ์ธ์๋ฅผ ๋ฐ์ ํฉ๊ณ๋ฅผ ๋ฐํํ๋
add๋ผ๋ Celery ํ์คํฌ๋ฅผ ์ ์ํฉ๋๋ค. add.delay(4, 4)ํจ์๋ ๋น๋๊ธฐ ์คํ์ ์ํด Celery ์์ปค์๊ฒ ํ์คํฌ๋ฅผ ๋ณด๋ ๋๋ค.result๊ฐ์ฒด๋ ๋น๋๊ธฐ ํ์คํฌ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ ๋๋ค. ํ์คํฌ๊ฐ ์๋ฃ๋๋ฉดresult.get()์ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.result.get()์ ๋ธ๋กํน(blocking)์ด๋ฉฐ ํ์คํฌ๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
RQ (Redis Queue) ์ฌ์ฉ
RQ(Redis Queue)๋ Redis๋ก ํ์คํฌ ํ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ๋ ๋ค๋ฅธ ์ธ๊ธฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. Celery๋ณด๋ค ๊ฐ๋จํ์ง๋ง ๋น๋๊ธฐ ํ์คํฌ ์ฒ๋ฆฌ๋ฅผ ์ํ ๊ฒฌ๊ณ ํ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค.
RQ ์ค์น
pip install rq redis
ํ์คํฌ ์ ์
๋ค์ ๋ด์ฉ์ ํฌํจํ๋ worker.py ํ์ผ์ ์์ฑํฉ๋๋ค:
import redis
from rq import Worker, Queue, Connection
import os
listen = ['default']
redis_url = os.getenv('REDIS_URL', 'redis://localhost:6379')
conn = redis.from_url(redis_url)
if __name__ == '__main__':
with Connection(conn):
worker = Worker(list(map(Queue, listen)))
worker.work()
๋ค์ ๋ด์ฉ์ ํฌํจํ๋ tasks.py ํ์ผ์ ์์ฑํฉ๋๋ค:
import time
def count_words_at_url(url):
import requests
resp = requests.get(url)
return len(resp.text.split())
ํ์คํฌ ํ์ ๋ฃ๊ธฐ
import redis
from rq import Queue
from tasks import count_words_at_url
redis_url = os.getenv('REDIS_URL', 'redis://localhost:6379')
conn = redis.from_url(redis_url)
q = Queue(connection=conn)
result = q.enqueue(count_words_at_url, 'http://nvie.com')
#You can retrieve the job result later
# from rq import job
#job = Job.fetch(result.id, connection=conn)
#print(job.result)
RQ ์์ปค ์คํ
ํฐ๋ฏธ๋์ ์ด๊ณ ๋ค์ ๋ช ๋ น์ ์คํํฉ๋๋ค:
python worker.py
์ด ์์ ์์:
- ์ฃผ์ด์ง URL์์ ๋จ์ด๋ฅผ ์ธ๋
count_words_at_urlํจ์๋ฅผ ์ ์ํฉ๋๋ค. q.enqueue(count_words_at_url, 'http://nvie.com')์ ์ฌ์ฉํ์ฌ ํ์คํฌ๋ฅผ ํ์ ๋ฃ๊ณ , ์ด๋ ํ์คํฌ๋ฅผ Redis ํ์ ์ถ๊ฐํฉ๋๋ค.- RQ ์์ปค๋ ํ์คํฌ๋ฅผ ๊ฐ์ ธ์ ๋น๋๊ธฐ์ ์ผ๋ก ์คํํฉ๋๋ค.
์ฌ๋ฐ๋ฅธ ๋ฉ์์ง ํ ์ ํ
Redis pub/sub, Celery, RQ ์ค ์ด๋ค ๊ฒ์ ์ ํํ ์ง๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค:
- Redis Pub/Sub: ๋ฉ์์ง ์ ๋ฌ์ด ์ค์ํ์ง ์์ ๊ฐ๋จํ ์ค์๊ฐ ๋ฉ์์ง ์๋๋ฆฌ์ค์ ์ ํฉํฉ๋๋ค.
- Celery: ํ์คํฌ ์ค์ผ์ค๋ง, ์ฌ์๋, ๊ฒฐ๊ณผ ์ถ์ ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ์ถ ๋ ๋ณต์กํ ํ์คํฌ ํ์ ์ข์ ์ ํ์ ๋๋ค. Celery๋ ๋ ์ฑ์ํ๊ณ ๊ธฐ๋ฅ์ด ํ๋ถํ ์๋ฃจ์ ์ ๋๋ค.
- RQ: Celery์ ๊ฐ๋จํ ๋์์ผ๋ก, ๊ธฐ๋ณธ์ ์ธ ํ์คํฌ ํ์ ์๊ตฌ์ ์ ํฉํฉ๋๋ค. ์ค์ ๋ฐ ๊ตฌ์ฑ์ด ๋ ์ฝ์ต๋๋ค.
๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ํ Redis ๋ฐ์ดํฐ ๊ตฌ์กฐ
Redis๋ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ฆฌ์คํธ
Redis ๋ฆฌ์คํธ๋ ์ ๋ ฌ๋ ๋ฌธ์์ด ์ปฌ๋ ์ ์ ๋๋ค. ํ, ์คํ ๋ฐ ๊ธฐํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
r.lpush('my_list', 'item1')
r.lpush('my_list', 'item2')
r.rpush('my_list', 'item3')
print(r.lrange('my_list', 0, -1)) # Output: [b'item2', b'item1', b'item3']
์ธํธ
Redis ์ธํธ๋ ๊ณ ์ ํ ๋ฌธ์์ด์ ์์ ์๋ ์ปฌ๋ ์ ์ ๋๋ค. ๋ฉค๋ฒ์ญ ํ ์คํธ, ํฉ์งํฉ, ๊ต์งํฉ ๋ฐ ์ฐจ์งํฉ ์ฐ์ฐ์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
r.sadd('my_set', 'item1')
r.sadd('my_set', 'item2')
r.sadd('my_set', 'item1') # Adding the same item again has no effect
print(r.smembers('my_set')) # Output: {b'item2', b'item1'}
์ ๋ ฌ๋ ์ธํธ
Redis ์ ๋ ฌ๋ ์ธํธ๋ ์ธํธ์ ์ ์ฌํ์ง๋ง ๊ฐ ์์๊ฐ ์ ์์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ์์๋ ์ ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค. ๋ฆฌ๋๋ณด๋, ์ฐ์ ์์ ํ ๋ฐ ๋ฒ์ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
r.zadd('my_sorted_set', {'item1': 10, 'item2': 5, 'item3': 15})
print(r.zrange('my_sorted_set', 0, -1)) # Output: [b'item2', b'item1', b'item3']
ํด์
Redis ํด์๋ ํค์ ๊ฐ ๋ชจ๋ ๋ฌธ์์ด์ธ ํค-๊ฐ ์ ์ฅ์์ ๋๋ค. ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ณ ๊ฐ๋ณ ํ๋์ ๋ํ ์์์ ์์ ์ ์ํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
r.hset('my_hash', 'field1', 'value1')
r.hset('my_hash', 'field2', 'value2')
print(r.hgetall('my_hash')) # Output: {b'field1': b'value1', b'field2': b'value2'}
Python Redis ํตํฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ์ฐ๊ฒฐ ํ๋ง: ๊ฐ ์์
๋ง๋ค Redis์ ์ ์ฐ๊ฒฐ์ ์์ฑํ๋ ๊ฒ์ ํผํ๊ธฐ ์ํด ์ฐ๊ฒฐ ํ๋ง์ ์ฌ์ฉํ์ญ์์ค.
redis-pyํด๋ผ์ด์ธํธ๋ ๋ด์ฅ ์ฐ๊ฒฐ ํ๋ง์ ์ ๊ณตํฉ๋๋ค. - ์ค๋ฅ ์ฒ๋ฆฌ: ์์ธ๋ฅผ ์ก๊ณ ์ฐ๊ฒฐ ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ์ญ์์ค.
- ๋ฐ์ดํฐ ์ง๋ ฌํ: ๋ณต์กํ ๊ฐ์ฒด๋ฅผ Redis์ ์ ์ฅํ๊ธฐ ์ํด JSON ๋๋ pickle๊ณผ ๊ฐ์ ์ ์ ํ ๋ฐ์ดํฐ ์ง๋ ฌํ ํ์์ ์ ํํ์ญ์์ค. ๊ฐ ํ์์ ์ฑ๋ฅ ๋ฐ ๋ณด์ ์ํฅ์ ๊ณ ๋ คํ์ญ์์ค.
- ํค ๋ช
๋ช
๊ท์น: Redis์์ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด ์ผ๊ด๋๊ณ ์ค๋ช
์ ์ธ ํค ๋ช
๋ช
๊ท์น์ ์ฌ์ฉํ์ญ์์ค. ์๋ฅผ ๋ค์ด,
user:{user_id}:name. - ๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น : Redis ์๋ฒ์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๊ณ ์ค๋ฅ ๋๋ ๊ฒฝ๊ณ ๋ฅผ ๋ก๊น ํ์ญ์์ค. RedisInsight์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค ์ฌ์ฉ๋์ ๋ชจ๋ํฐ๋งํ๊ณ ์ ์ฌ์ ์ธ ๋ณ๋ชฉ ํ์์ ์๋ณํ์ญ์์ค.
- ๋ณด์: ๊ฐ๋ ฅํ ์ํธ๋ฅผ ์ค์ ํ๊ณ , ๋ถํ์ํ ๋ช ๋ น์ ๋นํ์ฑํํ๊ณ , ๋คํธ์ํฌ ์ก์ธ์ค ์ ํ์ ๊ตฌ์ฑํ์ฌ Redis ์๋ฒ๋ฅผ ๋ณดํธํ์ญ์์ค. ๊ฐ๋ฅํ๋ค๋ฉด ๋ณดํธ๋ ๋คํธ์ํฌ ํ๊ฒฝ์์ Redis๋ฅผ ์คํํ์ญ์์ค.
- ์ฌ๋ฐ๋ฅธ Redis ์ธ์คํด์ค ์ ํ: ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ๋ถํ๋ฅผ ๊ณ ๋ คํ๊ณ Redis ์ธ์คํด์ค์ ์ ํฉํ ํฌ๊ธฐ๋ฅผ ์ ํํ์ญ์์ค. Redis ์ธ์คํด์ค์ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๋ฉด ์ฑ๋ฅ ์ ํ ๋ฐ ๋ถ์์ ์ฑ์ ์ด๋ํ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ
- ์๊ฐ๋: ํ์์คํฌํ๋ฅผ ํฌํจํ๋ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํ ๋ ์๊ฐ๋์ ์ ์ํ๊ณ ํ์์คํฌํ๋ฅผ ์ผ๊ด๋ ํ์(์: UTC)์ผ๋ก ์ ์ฅํ์ญ์์ค.
- ํตํ: ๊ธ์ต ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํ ๋ ํตํ ๋ณํ์ ์ ์คํ๊ฒ ์ฒ๋ฆฌํ์ญ์์ค.
- ๋ฌธ์ ์ธ์ฝ๋ฉ: ๋ค์ํ ์ธ์ด๋ฅผ ์ง์ํ๊ธฐ ์ํด Redis์ ์ ์ฅ๋ ๋ชจ๋ ๋ฌธ์์ด์ UTF-8 ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ์ญ์์ค.
- ํ์งํ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ์งํ๋ ๊ฒฝ์ฐ ๊ฐ ๋ก์ผ์ผ์ ๋ํด ๋ค๋ฅธ ๋ฒ์ ์ ๋ฐ์ดํฐ๋ฅผ ์บ์ํ์ญ์์ค.
๊ฒฐ๋ก
Redis๋ฅผ Python๊ณผ ํตํฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์บ์ฑ ๋ฐ ๋ฉ์์ง ํ์ Redis๋ฅผ ํ์ฉํจ์ผ๋ก์จ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ถํ๋ฅผ ์ค์ด๊ณ , ์ค๋ ์คํ๋๋ ์์ ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ฉฐ, ๋ ๋ฐ์์ ์ด๊ณ ๊ฒฌ๊ณ ํ ์์คํ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ด ๊ฐ์ด๋๋ ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ๊ธฐ๋ณธ ๊ฐ๋ , ๊ณ ๊ธ ๊ธฐ์ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ๋ Python๊ณผ Redis๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์๋ฅผ ์ ๊ณตํ์ต๋๋ค. ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์๊ตฌ ์ฌํญ์ ๊ณ ๋ คํ๊ณ Redis ํตํฉ์ ์ด์ ์ ๊ทน๋ํํ๊ธฐ ์ํด ์ ์ ํ ๋๊ตฌ์ ์ ๋ต์ ์ ํํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.